Python Pandas νΌλ² ν μ΄λΈλ‘ λ°μ΄ν° μ¬κ΅¬μ±μ λ§μ€ν°νμΈμ. κΈλ‘λ² λ°μ΄ν° λΆμμ μν ꡬ문, κ³ κΈ κΈ°μ λ° μ€μ©μ μΈ μμ μ λν μ¬μΈ΅μ μΈ νꡬ.
Python Pandas νΌλ² ν μ΄λΈ: λ°μ΄ν° μ¬κ΅¬μ±μ μ’ ν© κ°μ΄λ
λ°μ΄ν° λΆμμ μΈκ³μμ λ°μ΄ν°λ₯Ό μμ½νκ³ , μ§κ³νλ©°, μ¬κ΅¬μ±νλ λ₯λ ₯μ λ¨μν κΈ°μ μ΄ μλ μ΄λ₯λ ₯κ³Ό κ°μ΅λλ€. μμ λ°μ΄ν°λ λ³Έλμ ννλ‘ λ°©λνκ³ μμΈν μ₯λΆμ μ μ¬ν©λλ€. μ 보λ νλΆνμ§λ§ ν΄μνκΈ°λ μ΄λ ΅μ΅λλ€. μλ―Έ μλ ν΅μ°°λ ₯μ μΆμΆνλ €λ©΄ μ΄ μ₯λΆλ₯Ό κ°κ²°ν μμ½μΌλ‘ λ³νν΄μΌ ν©λλ€. λ°λ‘ μ΄ μ§μ μμ νΌλ² ν
μ΄λΈμ΄ νμνλ©°, Python νλ‘κ·Έλλ¨Έμκ² Pandas λΌμ΄λΈλ¬λ¦¬λ κ°λ ₯νκ³ μ μ°ν λκ΅¬μΈ pivot_table()μ μ 곡ν©λλ€.
μ΄ κ°μ΄λλ μ μΈκ³ λ°μ΄ν° λΆμκ°, κ³Όνμ λ° Python μ νΈκ°λ₯Ό μν΄ κ³ μλμμ΅λλ€. μ°λ¦¬λ Pandas νΌλ² ν μ΄λΈμ λ©μ»€λμ¦μ μ¬μΈ΅μ μΌλ‘ νꡬνλ©°, κΈ°λ³Έ κ°λ λΆν° κ³ κΈ κΈ°μ κΉμ§ λ€λ£° κ²μ λλ€. λ€μν λλ₯μ νλ§€ μμΉλ₯Ό μμ½νλ , μ§μλ³ κΈ°ν λ°μ΄ν°λ₯Ό λΆμνλ , λΆμ°λ νμ νλ‘μ νΈ μ§νλ₯Ό μΆμ νλ , νΌλ² ν μ΄λΈμ λ§μ€ν°νλ κ²μ λ°μ΄ν° νμ λ°©μμ κ·Όλ³Έμ μΈ λ³νλ₯Ό κ°μ Έμ¬ κ²μ λλ€.
νΌλ² ν μ΄λΈμ΄λ μ νν 무μμΈκ°μ?
Microsoft Excel λλ Google Sheetsμ κ°μ μ€νλ λμνΈ μννΈμ¨μ΄λ₯Ό μ¬μ©ν΄ λ³Έ μ μ΄ μλ€λ©΄ νΌλ² ν μ΄λΈμ κ°λ μ μ΅μν κ²μ λλ€. νΌλ² ν μ΄λΈμ λ ν° λ°μ΄ν° μΈνΈμμ μ νν μ΄κ³Ό νμ λ°μ΄ν°λ₯Ό μ¬κ΅¬μ±νκ³ μμ½νμ¬ μνλ λ³΄κ³ μλ₯Ό μ»μ μ μκ² ν΄μ£Όλ λνν ν μ΄λΈμ λλ€.
νΌλ² ν μ΄λΈμ λ κ°μ§ μ£Όμ κΈ°λ₯μ μνν©λλ€:
- μ§κ³ (Aggregation): νλ μ΄μμ λ²μ£Όλ‘ κ·Έλ£Ήνλ μμΉ λ°μ΄ν°μ λν΄ μμ½ ν΅κ³(μ: ν©κ³, νκ· , κ°μ)λ₯Ό κ³μ°ν©λλ€.
- μ¬κ΅¬μ± (Reshaping): λ°μ΄ν°λ₯Ό 'κΈ΄(long)' νμμμ 'λμ(wide)' νμμΌλ‘ λ³νν©λλ€. λͺ¨λ κ°μ λ¨μΌ μ΄μ κ°μ§λ λμ , μ΄μ κ³ μ κ°μ μΆλ ₯μ μ μ΄λ‘ 'νΌλ²'ν©λλ€.
Pandasμ pivot_table() ν¨μλ μ΄ κ°λ ₯ν κΈ°λ₯μ Python λ°μ΄ν° λΆμ μν¬νλ‘μ μ§μ κ°μ Έμ μ¬ν κ°λ₯νκ³ , μ€ν¬λ¦½νΈ μμ± κ°λ₯νλ©°, νμ₯ κ°λ₯ν λ°μ΄ν° μ¬κ΅¬μ±μ κ°λ₯νκ² ν©λλ€.
νκ²½ λ° μν λ°μ΄ν° μ€μ
μμνκΈ° μ μ Pandas λΌμ΄λΈλ¬λ¦¬κ° μ€μΉλμ΄ μλμ§ νμΈνμΈμ. μ€μΉλμ΄ μμ§ μλ€λ©΄ Pythonμ ν¨ν€μ§ μ€μΉ κ΄λ¦¬μμΈ pipλ₯Ό μ¬μ©νμ¬ μ€μΉν μ μμ΅λλ€:
pip install pandas
μ΄μ Python μ€ν¬λ¦½νΈ λλ λ ΈνΈλΆμμ κ°μ Έμ λ³΄κ² μ΅λλ€:
import pandas as pd
import numpy as np
κΈλ‘λ² νλ§€ λ°μ΄ν°μ μμ±
μμ λ₯Ό μ€μ©μ μ΄κ³ κΈλ‘λ²νκ² λ§λ€κΈ° μν΄, λ€κ΅μ μ μμκ±°λ νμ¬μ νλ§€ λ°μ΄ν°λ₯Ό λνλ΄λ κ°μμ λ°μ΄ν°μ μ μμ±ν κ²μ λλ€. μ΄ λ°μ΄ν°μ μλ λ€μν μ§μ, κ΅κ° λ° μ ν λ²μ£Όμ νλ§€ μ λ³΄κ° ν¬ν¨λ©λλ€.
# Create a dictionary of data
data = {
'TransactionID': range(1, 21),
'Date': pd.to_datetime([
'2023-01-15', '2023-01-16', '2023-01-17', '2023-02-10', '2023-02-11',
'2023-02-12', '2023-03-05', '2023-03-06', '2023-03-07', '2023-01-20',
'2023-01-21', '2023-02-15', '2023-02-16', '2023-03-10', '2023-03-11',
'2023-01-18', '2023-02-20', '2023-03-22', '2023-01-25', '2023-02-28'
]),
'Region': [
'North America', 'Europe', 'Asia', 'North America', 'Europe', 'Asia', 'North America', 'Europe', 'Asia', 'Europe',
'Asia', 'North America', 'Europe', 'Asia', 'North America', 'Asia', 'Europe', 'North America', 'Europe', 'Asia'
],
'Country': [
'USA', 'Germany', 'Japan', 'Canada', 'France', 'India', 'USA', 'UK', 'China', 'Germany',
'Japan', 'USA', 'France', 'India', 'Canada', 'China', 'UK', 'USA', 'Germany', 'India'
],
'Product_Category': [
'Electronics', 'Apparel', 'Electronics', 'Books', 'Apparel', 'Electronics', 'Books', 'Electronics', 'Apparel',
'Apparel', 'Books', 'Electronics', 'Books', 'Apparel', 'Electronics', 'Books', 'Apparel', 'Books', 'Electronics', 'Electronics'
],
'Units_Sold': [10, 5, 8, 20, 7, 12, 15, 9, 25, 6, 30, 11, 18, 22, 14, 28, 4, 16, 13, 10],
'Unit_Price': [1200, 50, 900, 15, 60, 1100, 18, 950, 45, 55, 12, 1300, 20, 40, 1250, 14, 65, 16, 1150, 1050]
}
# Create DataFrame
df = pd.DataFrame(data)
# Calculate Revenue
df['Revenue'] = df['Units_Sold'] * df['Unit_Price']
# Display the first few rows of the DataFrame
print(df.head())
μ΄ λ°μ΄ν°μ μ λ²μ£Όν λ°μ΄ν°(Region, Country, Product_Category), μμΉν λ°μ΄ν°(Units_Sold, Revenue) λ° μκ³μ΄ λ°μ΄ν°(Date)κ° νΌν©λ κ²¬κ³ ν κΈ°λ°μ μ 곡ν©λλ€.
pivot_table()μ ꡬ쑰
Pandasμ pivot_table() ν¨μλ λ§€μ° λ€μ¬λ€λ₯ν©λλ€. κ°μ₯ μ€μν λ§€κ°λ³μλ₯Ό μ΄ν΄λ³΄κ² μ΅λλ€:
pandas.pivot_table(data, values=None, index=None, columns=None, aggfunc='mean', fill_value=None, margins=False, margins_name='All')
- data: νΌλ²ν DataFrameμ λλ€.
- values: μ§κ³ν λ°μ΄ν°λ₯Ό ν¬ν¨νλ μ΄(λ€)μ λλ€. μ§μ νμ§ μμΌλ©΄ λλ¨Έμ§ λͺ¨λ μ«μ μ΄μ΄ μ¬μ©λ©λλ€.
- index: κ³ μ κ°μ΄ μ νΌλ² ν μ΄λΈμ νμ ꡬμ±ν μ΄(λ€)μ λλ€. μ΄λ₯Ό 'κ·Έλ£Ήν ν€(grouping key)'λΌκ³ λ ν©λλ€.
- columns: κ³ μ κ°μ΄ μ ν μ΄λΈμ μ΄λ‘ 'νΌλ²'λ μ΄(λ€)μ λλ€.
- aggfunc: 'values'μ μ μ©ν μ§κ³ ν¨μμ
λλ€. 'sum', 'mean', 'count', 'min', 'max'μ κ°μ λ¬Έμμ΄ λλ
np.sumκ³Ό κ°μ ν¨μμΌ μ μμ΅λλ€. μ¬λ¬ ν¨μ λͺ©λ‘μ΄λ λ€λ₯Έ μ΄μ λ€λ₯Έ ν¨μλ₯Ό μ μ©νκΈ° μν μ¬μ μ μ λ¬ν μλ μμ΅λλ€. κΈ°λ³Έκ°μ 'mean'μ λλ€. - fill_value: νΌλ² ν μ΄λΈμμ λλ½λ κ²°κ³Ό(NaN)λ₯Ό λ체ν κ°μ λλ€.
- margins: λΆμΈ κ°μ
λλ€.
Trueλ‘ μ€μ νλ©΄ νκ³Ό μ΄μ μκ³(μ΄ν©κ³λΌκ³ λ ν¨)λ₯Ό μΆκ°ν©λλ€. - margins_name:
margins=TrueμΌ λ μ΄κ³λ₯Ό ν¬ν¨νλ ν/μ΄μ μ΄λ¦μ λλ€. κΈ°λ³Έκ°μ 'All'μ λλ€.
첫 λ²μ§Έ νΌλ² ν μ΄λΈ: κ°λ¨ν μμ
μΌλ°μ μΈ λΉμ¦λμ€ μ§λ¬ΈλΆν° μμνκ² μ΅λλ€: "κ° μ ν λ²μ£Όλ³λ‘ μμ±λ μ΄ μμ΅μ μΌλ§μ λκΉ?"
μ΄μ λ΅νκΈ° μν΄μλ λ€μμ΄ νμν©λλ€:
- νμ
Product_Categoryλ₯Ό μ¬μ©ν©λλ€ (index). Revenueμ΄μ μ§κ³ν©λλ€ (values).- μ§κ³ ν¨μλ‘ ν©κ³λ₯Ό μ¬μ©ν©λλ€ (aggfunc).
# Simple pivot table to see total revenue by product category
category_revenue = pd.pivot_table(df,
values='Revenue',
index='Product_Category',
aggfunc='sum')
print(category_revenue)
μΆλ ₯:
Revenue
Product_Category
Apparel 1645
Books 1184
Electronics 56850
μ¦μ λͺ ννκ³ κ°κ²°ν μμ½μ μ»μ μ μμ΅λλ€. 20νμ μμ κ±°λ λ‘κ·Έκ° μ§λ¬Έμ μ§μ λ΅νλ 3ν ν μ΄λΈλ‘ μ¬κ΅¬μ±λμμ΅λλ€. μ΄κ²μ΄ νΌλ² ν μ΄λΈμ κ·Όλ³Έμ μΈ νμ λλ€.
μ΄ μ°¨μ μΆκ°
μ΄μ μ΄λ₯Ό νμ₯ν΄ λ³΄κ² μ΅λλ€. μ ν λ²μ£Όλ³ μ΄ μμ΅μ λ³΄κ³ μΆμ§λ§, μ§μλ³λ‘λ λΆλ₯νκ³ μΆλ€λ©΄ μ΄λ¨κΉμ? μ΄λ columns λ§€κ°λ³μκ° μλν©λλ€.
# Pivot table with index and columns
revenue_by_category_region = pd.pivot_table(df,
values='Revenue',
index='Product_Category',
columns='Region',
aggfunc='sum')
print(revenue_by_category_region)
μΆλ ₯:
Region Asia Europe North America Product_Category Apparel 1125.0 625.0 NaN Books 336.0 360.0 488.0 Electronics 13200.0 14550.0 29100.0
μ΄ μΆλ ₯μ ν¨μ¬ λ νλΆν©λλ€. 'Region' μ΄('Asia', 'Europe', 'North America')μ κ³ μ κ°μ μ μ΄λ‘ νΌλ²νμ΅λλ€. μ΄μ λ€μν μ ν λ²μ£Όκ° μ§μλ³λ‘ μ΄λ»κ² μ±κ³Όλ₯Ό λ΄λμ§ μ½κ² λΉκ΅ν μ μμ΅λλ€. NaN(Not a Number) κ°λ 보μ
λλ€. μ΄λ λ°μ΄ν°μ
μμ 'λΆλ―Έ' μ§μμ λν 'μλ₯' νλ§€κ° κΈ°λ‘λμ§ μμμμ λνλ
λλ€. μ΄κ² μ체λ‘λ κ·μ€ν μ 보μ
λλ€!
κ³ κΈ νΌλ² κΈ°μ
κΈ°λ³Έ κΈ°λ₯λ κ°λ ₯νμ§λ§, pivot_table()μ μ§μ ν μ μ°μ±μ κ³ κΈ κΈ°λ₯μμ λλ¬λ©λλ€.
fill_valueλ₯Ό μ¬μ©ν κ²°μΈ‘κ° μ²λ¦¬
μ΄μ ν
μ΄λΈμ NaNμ μ ννμ§λ§, λ³΄κ³ μ μμ±μ΄λ μΆκ° κ³μ°μ μν΄ 0μΌλ‘ νμνλ κ²μ΄ λ λ°λμ§ν μ μμ΅λλ€. fill_value λ§€κ°λ³μλ μ΄λ₯Ό μ½κ² ν΄μ€λλ€.
# Using fill_value to replace NaN with 0
revenue_by_category_region_filled = pd.pivot_table(df,
values='Revenue',
index='Product_Category',
columns='Region',
aggfunc='sum',
fill_value=0)
print(revenue_by_category_region_filled)
μΆλ ₯:
Region Asia Europe North America Product_Category Apparel 1125 625 0 Books 336 360 488 Electronics 13200 14550 29100
μ΄μ ν μ΄λΈμ΄ λ κΉλν΄μ‘κ³ , νΉν λΉμ λ¬Έκ°μκ² λ μ½κΈ° μ¬μμ‘μ΅λλ€.
λ€μ€ μΈλ±μ€(κ³μΈ΅μ μΈλ±μ±) μ¬μ©
νμ λ κ° μ΄μμ λ²μ£Όλ‘ κ·Έλ£Ήνν΄μΌ νλ€λ©΄ μ΄λ¨κΉμ? μλ₯Ό λ€μ΄, Regionλ³λ‘ νλ§€λ₯Ό λΆλ₯ν λ€μ κ° μ§μ λ΄μμ Countryλ³λ‘ λΆλ₯ν΄ λ³΄κ² μ΅λλ€. index λ§€κ°λ³μμ μ΄ λͺ©λ‘μ μ λ¬ν μ μμ΅λλ€.
# Multi-level pivot table using a list for the index
multi_index_pivot = pd.pivot_table(df,
values='Revenue',
index=['Region', 'Country'],
aggfunc='sum',
fill_value=0)
print(multi_index_pivot)
μΆλ ₯:
Revenue
Region Country
Asia China 488
India 1760
Japan 10860
Europe France 1020
Germany 14440
UK 1115
North America Canada 17800
USA 12058
Pandasλ νμ μλμΌλ‘ MultiIndexλ₯Ό μμ±νμ΅λλ€. μ΄ κ³μΈ΅μ ꡬ쑰λ λ°μ΄ν°λ₯Ό μμΈν μ΄ν΄λ³΄κ³ μ€μ²©λ κ΄κ³λ₯Ό νμ
νλ λ° νμμ μ
λλ€. λμΌν λ
Όλ¦¬λ₯Ό columns λ§€κ°λ³μμ μ μ©νμ¬ κ³μΈ΅μ μ΄μ μμ±ν μ μμ΅λλ€.
μ¬λ¬ μ§κ³ ν¨μ μ¬μ©
λλ‘λ νλμ μμ½ ν΅κ³λ§μΌλ‘λ μΆ©λΆνμ§ μμ μ μμ΅λλ€. κ° κ·Έλ£Ήμ λν΄ μ΄ μμ΅(ν©κ³)κ³Ό νκ· κ±°λ κ·λͺ¨(νκ· )λ₯Ό λͺ¨λ λ³΄κ³ μΆμ μ μμ΅λλ€. aggfuncμ ν¨μ λͺ©λ‘μ μ λ¬ν μ μμ΅λλ€.
# Using multiple aggregation functions
multi_agg_pivot = pd.pivot_table(df,
values='Revenue',
index='Region',
aggfunc=['sum', 'mean', 'count'])
print(multi_agg_pivot)
μΆλ ₯:
sum mean count
Revenue Revenue Revenue
Region
Asia 13108.000000 2184.666667 6
Europe 16575.000000 2762.500000 6
North America 29858.000000 4976.333333 6
μ΄ λ¨μΌ λͺ λ Ήμ κ° μ§μλ³ μ΄ μμ΅, κ±°λλΉ νκ· μμ΅, κ±°λ νμλ₯Ό ν¬ν¨νλ ν¬κ΄μ μΈ μμ½μ μ 곡ν©λλ€. Pandasκ° μΆλ ₯μ 체κ³μ μΌλ‘ μ 리νκΈ° μν΄ κ³μΈ΅μ μ΄μ μμ±νλ λ°©μμ μ£Όλͺ©νμΈμ.
λ€λ₯Έ κ°μ λ€λ₯Έ ν¨μ μ μ©
λ μΈλΆνλ μμ
μ μνν μ μμ΅λλ€. Revenueμ ν©κ³μ Units_Soldμ νκ· μ λ³΄κ³ μΆλ€κ³ μμν΄ λ³΄μΈμ. aggfuncμ μ¬μ (dictionary)μ μ λ¬ν μ μμΌλ©°, ν€λ μ΄ μ΄λ¦('values')μ΄κ³ κ°μ μνλ μ§κ³ ν¨μμ
λλ€.
# Different aggregations for different values
dict_agg_pivot = pd.pivot_table(df,
index='Region',
values=['Revenue', 'Units_Sold'],
aggfunc={
'Revenue': 'sum',
'Units_Sold': 'mean'
},
fill_value=0)
print(dict_agg_pivot)
μΆλ ₯:
Revenue Units_Sold
Region
Asia 13108 17.833333
Europe 16575 8.166667
North America 29858 14.333333
μ΄λ¬ν μ μ΄ μμ€μ΄ pivot_table()μ μ κ΅ν λ°μ΄ν° λΆμμ μν μ΅κ³ μ λκ΅¬λ‘ λ§λλλ€.
marginsλ₯Ό μ¬μ©ν μ΄ν©κ³ κ³μ°
λ³΄κ³ λͺ©μ μ μν΄ ν λ° μ΄ μ΄κ³λ μ’
μ’
νμμ μ
λλ€. margins=True μΈμλ μΆκ°μ μΈ λ
Έλ ₯ μμ΄ μ΄λ₯Ό μ 곡ν©λλ€.
# Adding totals with margins=True
revenue_with_margins = pd.pivot_table(df,
values='Revenue',
index='Product_Category',
columns='Region',
aggfunc='sum',
fill_value=0,
margins=True,
margins_name='Grand Total') # Custom name for totals
print(revenue_with_margins)
μΆλ ₯:
Region Asia Europe North America Grand Total Product_Category Apparel 1125 625 0 1750 Books 336 360 488 1184 Electronics 13200 14550 29100 56850 Grand Total 14661 15535 29588 59784
Pandasλ κ° ν(λͺ¨λ μ§μμ κ±ΈμΉ μ ν λ²μ£Όλ³ μ΄ μμ΅)κ³Ό κ° μ΄(λͺ¨λ λ²μ£Όμ κ±ΈμΉ μ§μλ³ μ΄ μμ΅)μ λν ν©κ³λ₯Ό μλμΌλ‘ κ³μ°νλ©°, μ€λ₯Έμͺ½ νλ¨μλ λͺ¨λ λ°μ΄ν°μ λν μ΄ν©κ³λ₯Ό μ 곡ν©λλ€.
μ€μ©μ μΈ μ¬μ© μ¬λ‘: μκ° κΈ°λ° λΆμ
νΌλ² ν μ΄λΈμ μ μ λ²μ£Όμλ§ κ΅νλμ§ μμ΅λλ€. μκ³μ΄ λ°μ΄ν°λ₯Ό λΆμνλ λ° λ§€μ° μ μ©ν©λλ€. κ° μλ³ μ΄ μμ΅μ μ°Ύμλ³΄κ² μ΅λλ€.
λ¨Όμ , 'Date' μ΄μμ μμ μΆμΆν΄μΌ ν©λλ€. μ΄λ₯Ό μν΄ Pandasμ .dt μ κ·Όμλ₯Ό μ¬μ©ν μ μμ΅λλ€.
# Extract month from the Date column
df['Month'] = df['Date'].dt.month_name()
# Pivot to see monthly revenue by product category
monthly_revenue = pd.pivot_table(df,
values='Revenue',
index='Month',
columns='Product_Category',
aggfunc='sum',
fill_value=0)
# Optional: Order the months correctly
month_order = ['January', 'February', 'March']
monthly_revenue = monthly_revenue.reindex(month_order)
print(monthly_revenue)
μΆλ ₯:
Product_Category Apparel Books Electronics Month January 250 360 23100 February 795 794 24250 March 705 30 9500
μ΄ ν μ΄λΈμ μκ° κ²½κ³Όμ λ°λ₯Έ κ° λ²μ£Όμ νλ§€ μ€μ μ λͺ ννκ² λ³΄μ¬μ£Όμ΄, μΆμΈ, κ³μ μ± λλ μ΄μ μ§νλ₯Ό μ½κ² λ°κ²¬ν μ μκ² ν΄μ€λλ€.
pivot_table() λ groupby(): μ°¨μ΄μ μ 무μμΈκ°μ?
μ΄λ Pandasλ₯Ό λ°°μ°λ μ¬λλ€μκ² νν μ§λ¬Έμ
λλ€. λ ν¨μλ λ°μ νκ² κ΄λ ¨λμ΄ μμΌλ©°, μ¬μ€ pivot_table()μ groupby() μμ ꡬμΆλμμ΅λλ€.
groupby()λ λ μΌλ°μ μ΄κ³ κ·Όλ³Έμ μΈ μ°μ°μ λλ€. νΉμ κΈ°μ€μ λ°λΌ λ°μ΄ν°λ₯Ό κ·Έλ£Ήνν λ€μ μ§κ³ ν¨μλ₯Ό μ μ©ν μ μμ΅λλ€. κ²°κ³Όλ μΌλ°μ μΌλ‘ κ³μΈ΅μ μΈλ±μ€λ₯Ό κ°μ§ Pandas Series λλ DataFrameμ΄μ§λ§, 'κΈ΄(long)' νμμΌλ‘ μ μ§λ©λλ€.pivot_table()μ κ·Έλ£Ήνλ₯Ό μνν λ€μ λ°μ΄ν°λ₯Ό μ¬κ΅¬μ±νλ νΉμ λꡬμ λλ€. μ£Όλ λͺ©μ μ λ°μ΄ν°λ₯Ό κΈ΄ νμμμ λμ νμμΌλ‘ λ³ννλ κ²μΌλ‘, μ΄λ μ’ μ’ μ¬λμ΄ λ μ½κΈ° μ½μ΅λλ€.
groupby()λ₯Ό μ¬μ©νμ¬ μ²« λ²μ§Έ μμ λ₯Ό λ€μ μ΄ν΄λ³΄κ² μ΅λλ€:
# Same result as our first pivot table, but using groupby
category_revenue_groupby = df.groupby('Product_Category')['Revenue'].sum()
print(category_revenue_groupby)
κ²°κ³Όλ 첫 λ²μ§Έ νΌλ² ν μ΄λΈμ DataFrameκ³Ό κΈ°λ₯μ μΌλ‘ λμΌν Pandas Seriesμ λλ€. κ·Έλ¬λ λ λ²μ§Έ κ·Έλ£Ήν ν€(μ: 'Region')λ₯Ό λμ νλ©΄ μ°¨μ΄μ μ΄ λͺ νν΄μ§λλ€.
# Grouping by two columns
groupby_multi = df.groupby(['Product_Category', 'Region'])['Revenue'].sum()
print(groupby_multi)
μΆλ ₯ (MultiIndexλ₯Ό κ°μ§ Series):
Product_Category Region
Apparel Asia 1125
Europe 625
Books Asia 336
Europe 360
North America 488
Electronics Asia 13200
Europe 14550
North America 29100
Name: Revenue, dtype: int64
pivot_table(index='Product_Category', columns='Region')μ λμΌν 'λμ(wide)' νμμ μ»μΌλ €λ©΄ groupby() λ€μμ unstack()μ μ¬μ©ν΄μΌ ν©λλ€:
# Replicating a pivot table with groupby().unstack()
groupby_unstack = df.groupby(['Product_Category', 'Region'])['Revenue'].sum().unstack(fill_value=0)
print(groupby_unstack)
μ΄λ μ΄μ΄ μλ νΌλ² ν
μ΄λΈκ³Ό μ νν λμΌν μΆλ ₯μ μμ±ν©λλ€. λ°λΌμ pivot_table()μ μΌλ°μ μΈ groupby().aggregate().unstack() μν¬νλ‘μ λν νΈλ¦¬ν λ¨μΆν€λ‘ μκ°ν μ μμ΅λλ€.
μΈμ μ΄λ€ κ²μ μ¬μ©ν΄μΌ ν κΉμ?
pivot_table()μ νΉν λ³΄κ³ μ μμ±μ΄λ κ΅μ°¨ν(crosstabs)λ₯Ό λ§λ€ λ μ¬λμ΄ μ½κΈ° μ¬μ΄ λμ νμμ μΆλ ₯μ μν λ μ¬μ©ν©λλ€.groupby()λ λ λ§μ μ μ°μ±μ΄ νμνκ±°λ, λ°μ΄ν° μ²λ¦¬ νμ΄νλΌμΈμμ μ€κ° κ³μ°μ μννκ±°λ, μ¬κ΅¬μ±λ λμ νμμ΄ μ΅μ’ λͺ©νκ° μλ λ μ¬μ©ν©λλ€.
μ±λ₯ λ° λͺ¨λ² μ¬λ‘
pivot_table()μ΄ κ°λ ₯νμ§λ§, νΉν λκ·λͺ¨ λ°μ΄ν°μ
μμλ ν¨μ¨μ μΌλ‘ μ¬μ©νλ κ²μ΄ μ€μν©λλ€.
- λ¨Όμ νν°λ§, λμ€μ νΌλ²: λ°μ΄ν°μ νμ μ§ν©(μ: μλ νλ§€λ)λ§ λΆμν΄μΌ νλ κ²½μ°, νΌλ² ν μ΄λΈμ μ μ©νκΈ° μ μ DataFrameμ νν°λ§ν©λλ€. μ΄λ κ² νλ©΄ ν¨μκ° μ²λ¦¬ν΄μΌ νλ λ°μ΄ν° μμ΄ μ€μ΄λλλ€.
- λ²μ£Όν νμ
μ¬μ©: νΌλ² ν
μ΄λΈμμ μΈλ±μ€ λλ μ΄λ‘ μμ£Ό μ¬μ©νλ μ΄(μ: 'Region' λλ 'Product_Category')μ κ²½μ°, Pandasμ 'category' dtypeμΌλ‘ λ³ννμΈμ. μ΄λ κ² νλ©΄ λ©λͺ¨λ¦¬ μ¬μ©λμ ν¬κ² μ€μ΄κ³ κ·Έλ£Ήν μμ
μλλ₯Ό λμΌ μ μμ΅λλ€.
df['Region'] = df['Region'].astype('category') - κ°λ μ± μ μ§: λ무 λ§μ μΈλ±μ€μ μ΄μ κ°μ§ νΌλ² ν μ΄λΈ μμ±μ νΌνμΈμ. κ°λ₯νκΈ΄ νμ§λ§, μλ°± κ°μ μ΄κ³Ό μμ² κ°μ νμ κ°μ§ νΌλ² ν μ΄λΈμ μλμ μμ λ°μ΄ν°λ§νΌ μ½κΈ° μ΄λ €μμ§ μ μμ΅λλ€. νΉμ λͺ©μ μ λ§λ μμ½μ λ§λλ λ° μ¬μ©νμΈμ.
- μ§κ³ μ΄ν΄:
aggfuncμ νμ μ μνμΈμ. κ°κ²©μ 'sum'μ μ¬μ©νλ κ²μ μλ―Έκ° μμΌλ©°, 'mean'μ΄ λ μ μ ν μ μμ΅λλ€. νμ μ§κ³κ° λ΅λ³νλ €λ μ§λ¬Έκ³Ό μΌμΉνλμ§ νμΈνμΈμ.
κ²°λ‘ : ν΅μ°°λ ₯ μλ μμ½μ μν λꡬ
Pandasμ pivot_table() ν¨μλ λͺ¨λ λ°μ΄ν° λΆμκ°μ λꡬ ν€νΈμ νμμ μΈ λꡬμ
λλ€. μ§μ λΆνκ³ μμΈν λ°μ΄ν°μμ κΉλνκ³ ν΅μ°°λ ₯ μλ μμ½μΌλ‘ μ΄λνλ μ μΈμ μ΄κ³ ννλ ₯μ΄ νλΆνλ©° κ°λ ₯ν λ°©λ²μ μ 곡ν©λλ€. values, index, columns, aggfuncμ κ°μ ν΅μ¬ κ΅¬μ± μμλ₯Ό μ΄ν΄νκ³ λ§μ€ν°νλ©°, λ€λ¨κ³ μΈλ±μ±, μ¬μ©μ μ μ μ§κ³ λ° μ¬λ°±κ³Ό κ°μ κ³ κΈ κΈ°λ₯μ νμ©ν¨μΌλ‘μ¨ λͺ μ€μ Python μ½λλ‘ λ³΅μ‘ν λΉμ¦λμ€ μ§λ¬Έμ λ΅νλλ‘ λ°μ΄ν°λ₯Ό μ¬κ΅¬μ±ν μ μμ΅λλ€.
λ€μ λ²μ λκ·λͺ¨ λ°μ΄ν°μ μ μ§λ©΄νμ λ, λμλ νμ μ€ν¬λ‘€νλ €λ μΆ©λμ μ°ΈμΌμΈμ. λμ , λ΅λ³ν΄μΌ ν μ§λ¬Έκ³Ό νΌλ² ν μ΄λΈμ΄ λ°μ΄ν°λ₯Ό μ΄λ»κ² μ¬κ΅¬μ±νμ¬ μ¨κ²¨μ§ μ΄μΌκΈ°λ₯Ό λλ¬λΌ μ μλμ§ μκ°ν΄ 보μΈμ. μ¦κ±°μ΄ νΌλ²ν λμΈμ!